let ua = window.navigator.userAgent
export const browser = {
	// 移动端设备
	IsMobile: !!ua.match(/AppleWebKit.*Mobile.*/), // 是否为移动终端
	IsAndroid: /Android|HTC/i.test(ua) ||
		!!(window.navigator['platform'] + '').match(/Linux/i), // android终端或UC浏览器
	IsIPad: !/Android|HTC/i.test(ua) && /iPad/i.test(ua), //iPad终端
	IsIPhone: !/Android|HTC/i.test(ua) && /iPod|iPhone/i.test(ua),
	IsIOS: (!/Android|HTC/i.test(ua) && /iPad/i.test(ua)) ||
		(!/Android|HTC/i.test(ua) && /iPod|iPhone/i.test(ua)),
	IsWHBJApp: /whbj/i.test(ua), // /whbj/i.test(ua)
	IsWHBJAndroidApp: /Android-APP-whbj/i.test(ua),
	// 浏览器
	IsTrident: ua.indexOf('Trident') > -1, // IE浏览器 trident内核
	IsPresto: ua.indexOf('Presto') > -1, // opera浏览器 presto内核
	IsWebKit: ua.indexOf('AppleWebKit') > -1, // chrome safari浏览器 webkit内核
	IsGecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') == -1, //firefox浏览器 gecko内核
	IsWebApp: ua.indexOf('Safari') == -1, //是否web应用程序，没有头部与底部
	// APP
	IsWeChat: ua.match(/MicroMessenger/i) == 'MicroMessenger', // 微信
	IsWeibo: ua.match(/WeiBo/i) == 'Weibo', // 微博
	IsQQ: ua.match(/QQ/i) == 'QQ', // QQ
	IsMiniProgram: (ua.match(/miniprogram/i) == "miniprogram" || ua.match(/miniProgram/i) == "miniProgram") //小程序
}

//判断对象是否为空
export const objIsEmpty = (obj) => {
	if (
		typeof obj === 'undefined' ||
		obj === null ||
		obj === '' ||
		JSON.stringify(obj) === '{}'
	) {
		return true
	} else {
		return false
	}
}

/**
 * 不足10补0
 */
export const Appendzero = (obj) => {
	if (obj < 10) return '0' + '' + obj
	else return obj
}

/**
 * 表单校验失败提示
 */
export const fieldFailed = (errorInfo) => {
	console.log('fieldFailed', errorInfo)
	let dom = document.getElementsByName(`${errorInfo.errors[0].name}`)[0]
	if (dom) dom.focus()
	EleMessage.error(errorInfo.errors[0].message)
}

/**
 * 监听输入框弹起
 */
export const inputIntoView = (callBack) => {
	window.addEventListener('resize', () => {
		if (
			document.activeElement.tagName === 'INPUT' ||
			document.activeElement.tagName === 'TEXTAREA'
		) {
			window.setTimeout(() => {
				document.activeElement.scrollIntoViewIfNeeded()
			}, 0)
		}
		callBack && callBack()
	})

	// 如果是IOS设备
	// if (browser.IsIOS) {
	// 	// 失焦后，键盘关闭
	// 	document.body.addEventListener('focusout', () => {
	// 		// 页面滚动回原来的位置
	// 		setTimeout(() => {
	// 			window.scrollTo({top: 0, left: 0, behavior: 'smooth'});
	// 		}, 200);
	// 	})
	// }
}

/**
 * @param {*} fn 要执行的函数
 * @param {*} delay 延迟时间
 * @returns
 */
export const debounce = (fn, delay, immediate = false) => {
	// 1.定义一个定时器, 保存上一次的定时器
	let timer = null;
	let isInvoke = false; //记录立即执行是否已执行过

	// 2.真正执行的函数
	const _debounce = function(...args) {
		// 取消上一次的定时器
		if (timer) clearTimeout(timer)
		// 判断是否需要立即执行
		if (immediate && !isInvoke) {
			fn.apply(this, args);
			isInvoke = true;
		} else {
			// 延迟执行
			timer = setTimeout(() => {
				// 外部传入的真正要执行的函数
				fn();

				//没有这个步骤时，只有第一次输入是立即执行，即使后面延迟执行后再输入也是延迟执行；
				// 有这个步骤时，第一次输入时立即执行，后面延迟执行后再输入也会有立即执行
				isInvoke = false
				timer = null
			}, delay);
		}
	}

	return _debounce
}

/**
 * 节流函数
 */
export const throttle = (fn, delay = 200) => {
	let timeout;
	return function() {
		let that = this;
		let args = arguments;
		if (!timeout) {
			timeout = setTimeout(() => {
				timeout = null;
				func.apply(that, args)
			}, delay)
		}
	}
}

/**
 * 手机号脱敏
 */
export const phoneHide = (val) => {
	let str = /^(.{3}).*(.{4})$/
	return val.replace(str, '$1****$2')
}

/**
 * 文本高亮
 * val：目标字符串
 * lightKey：需要高亮的关键字
 * color：高亮的颜色
 */
export const highLight = (val, lightKey, color = 'red') => {
	if (val && val.indexOf(lightKey) !== -1) {
		//判断这个字段中是否包含keyword
		// 如果包含的话，就把这个字段中的那一部分进行替换成html字符
		return val.replace(
			lightKey,
			`<span style="color: ${color}">${lightKey}</span>`
		)
	} else {
		return val
	}
}

/**
 * 判断目标日期与现在为止，是否大于n天
 */
export const judgeTime = (time, n) => {
	let str = time + ""
	str = str.replace(/-/g, '/')
	var beginDate = new Date(str);
	var endDate = new Date();
	var day = (endDate - beginDate) / (1000 * 60 * 60 * 24);
	if (day > n) {
		return true
	} else {
		return false
	}
}

/**
 * 浏览器上复制粘贴
 */
export const copyText = (textToCopy) => {
	if (navigator.clipboard && window.isSecureContext) {
		// navigator clipboard 向剪贴板写文本
		return navigator.clipboard.writeText(textToCopy).then(function() {
			EleMessage.success('复制成功');
		}).catch(e => {
			EleMessage.error('复制失败');
		});
	} else {
		// document.execCommand('copy') 向剪贴板写文本
		let input = document.createElement('input')
		input.style.position = 'fixed'
		input.style.top = '-10000px'
		input.style.zIndex = '-999'
		document.body.appendChild(input)
		input.value = textToCopy
		input.focus()
		input.select()
		try {
			let result = document.execCommand('copy')
			document.body.removeChild(input)
			if (!result || result === 'unsuccessful') {
				EleMessage.error('复制失败');
			} else {
				EleMessage.success('复制成功');
			}
		} catch (e) {
			document.body.removeChild(input)
			EleMessage.error('当前浏览器不支持复制功能，请检查更新或更换其他浏览器操作');
		}
	}
}

/**
 * 判断是否是文件
 * @param obj 对象
 */
export function isBlobFile(obj: any) {
	return obj != null && (obj instanceof Blob || obj instanceof File);
}

/**
 * 下载blob流文件
 * @param data 二进制数据
 * @param name 文件名
 * @param type 文件类型
 */
export function download(data: Blob | string, name: string, type ? : string) {
	const blob = new Blob([data], { type: type || 'application/octet-stream' });
	const url = window.URL.createObjectURL(
		blob); // url: blob:http://localhost:5173/1e06db06-e8f7-4dcb-85a4-fcb46b78f0c7
	const a = document.createElement('a');
	a.href = url;
	a.download = name;
	a.style.display = 'none';
	document.body.appendChild(a);
	a.click();
	document.body.removeChild(a);
	URL.revokeObjectURL(url);
}


/**
 * 下载url文件
 * url 文件url
 * fileName 文件名
 */
export function urlDownload(url, fileName) {
	const fileUrl = url + fileName; // 文件的URL地址
	window.open(fileUrl);
}

/**
 * 拼接省市区 中文文本
 */
export function patchProvinceCityCounty(province, city, county) {
	if (county)
		return province + '/' + city + '/' + county
	if (city)
		return province + '/' + city
	if (province)
		return province
}


/**
 * 获取url中的参数
 */
export const getUrlParams = function(url) {
	// 截取url中的code方法
	let params = new Object()
	if (url.indexOf('?') != -1) {
		var str = url.substr(1)
		var strs = str.split('?')[1].split('&')
		for (var i = 0; i < strs.length; i++) {
			theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1]
		}
	}
	return params
}